[Auth0] Auth0+Amazon EventBridge+AWS Lambda+New Relicで認証・認可のログを自動分析、可視化できるようにしてみた [New Relic]
こんにちは。
ゲームソリューション部の西川です。
今回はAuth0、Amazon EventBridge(以下、EventBridge)、AWS Lambda(以下、Lambda)、New Relicを利用して、認証・認可のログを分析できるようにしてみます。
認証・認可のログを分析できるようになることで、不正アクセスの検知、リアルタイムなアラートの設定、アクティブユーザのトラッキングなどを行えるというメリットがあります。
つまりは、システムだけでなく、ビジネス的な観点でも大きなメリットがあります。
今回の構成であれば、実装・運用コストを抑えて導入することができますので、検討のご参考になれば幸いです。
それではまず、各サービスの説明をしたあと、実際に設定、動作確認を行っていきます。
サービスの説明
Auth0
Auth0は、手軽に認証・認可を実装できるIDaaS(Identity as a Service)プラットフォームです。OAuth、OICD、SAMLなどの標準プロトコルをサポートしており、SSOやMFA、パスキーなどの機能も簡単に導入することができます。
今回は、単純に認証基盤として利用します。
Amazon EventBridge
EventBridgeは、AWSの提供するサーバレスイベントバスサービスです。イベント駆動型アーキテクチャを構築することができます。
今回は、外部サービス(Auth0)と連携し、イベントをLambdaにルーティングして、New Relicにログを連携します。
New Relic
New Relicは、アプリケーションやインフラのパフォーマンスを監視・可視化するためのAPM(Application Performance Monitoring)ツールです。システムの状態をリアルタイムに観測することで、オブザーバビリティの向上を行えます。
それでは、設定を行っていきます。
設定
まずは、Auth0側の設定です。
MonitoringのStreamsからCreate Stream
を押下します。
Amazon EventBridgeを選択します。
任意のNameを入力して、Createを押下します。
Streamの作成ができました。
Tutorialには作成したStreamとEventBridgeの連携の設定方法が記載されていますので、こちらを参考に進めていきます。
EventBridgeの設定にいき、パートナーイベントソースにてauth0と検索し、Auth0の設定を押下します。
AWSアカウントIDをコピーします。
コピーしたAWSアカウントIDを作成したStreamの設定のAWS Account ID
に入力します。
また、AWS Region
はEventBridgeを作成したリージョンを一致させます。
設定が完了したらSave
を押下します。
これで、Auth0側の設定は完了です。
EventBridgeの設定に戻ります。
Auth0側の設定が正しく行えていれば、パートナーイベントソースから、イベントバスと関連づけられるようになっております。
「関連付ける」を押下します。
関連付けが完了しました。
続いて、Lambdaの作成を行います。
Lambdaから「関数の作成」を押下します。
任意の関数名を入力し、ランタイムは今回は「Python 3.12」を選択します。
「関数の作成」を押下します。
今回、New RelicのLogAPIを使用するため、そのパラメータ周りで必要な環境変数を設定していきます。
New Relic側でライセンスキーを発行します。
API Keysの設定画面から、Key typeはLicenseを選択し、任意のNameを入力します。
作成が完了するとkeyをコピーできるようになっているのでCopy Key
よりコピーします。
Lambdaの画面に戻り、環境変数の設定画面から編集を押下します。
以下のようにそれぞれ設定していきます。
X_License_Key: 上記でコピーしたライセンスキー
Service_Name: Auth0
Hostname: Auth0のホストネーム
設定できたら、「保存」を押下します。
環境変数の設定が完了しました。
続いて、コードソースを書いていきます。
今回はChatGPTでソースの叩き台を出力し、細かいところを修正する形で作成しました。
ソースコード
import os
import json
import requests
from datetime import datetime
# 環境変数から設定を取得
NEW_RELIC_LICENSE_KEY = os.environ['X_License_Key']
SERVICE_NAME = os.environ['Service_Name']
HOSTNAME = os.environ['Hostname']
# New Relic LogAPIのエンドポイント
NEW_RELIC_LOG_API_URL = "https://log-api.newrelic.com/log/v1"
def lambda_handler(event, context):
"""
Lambda関数のエントリポイント
"""
try:
# EventBridgeからAuth0のログを取得
print("Received event:", json.dumps(event))
# New Relicに送信するログデータを構築
log_payload = {
"timestamp": int(datetime.utcnow().timestamp() * 1000), # UNIXエポックタイム (ミリ秒)
"message": event.get('detail'),
"service_name": SERVICE_NAME,
"hostname": HOSTNAME
}
# New Relic LogAPIに送信
response = send_log_to_new_relic(log_payload)
# レスポンスをログに出力
print(f"New Relic response: {response.status_code}, {response.text}")
except Exception as e:
print(f"Error processing event: {str(e)}")
raise
def send_log_to_new_relic(log_payload):
"""
New Relic LogAPIにログを送信する
"""
headers = {
"Content-Type": "application/json",
"X-License-Key": NEW_RELIC_LICENSE_KEY,
"Accept": "*/*"
}
# POSTリクエストを送信
response = requests.post(NEW_RELIC_LOG_API_URL, headers=headers, json=log_payload)
# エラーハンドリング
if response.status_code != 202:
print(f"Failed to send log to New Relic: {response.status_code}, {response.text}")
response.raise_for_status()
return response
ソースコードを作成したら、Deployを押下します。
このままだと、インポートしているrequestがインポートできず、エラーが出てくるので、レイヤーを追加しておきます。
「レイヤーの追加」を押下します。
「ARNを指定」を選択し、ARNを入力し、「追加」を押下します。
今回使用したARNは有志によって作成されたものを利用しています。
詳しくは下記をご覧ください。
これで、Lambda関数の作成が完了となります。
続いて、EventBridgeに戻り、ルールの作成を行なっていきます。
作成したイベントバスを開き、「ルールを作成」を押下します。
任意の名前の入力し、「次へ」を押下します。
カスタムパターンを選択し、イベントパターンを以下のように入力します。
下記のように入力することで、成功した場合のみイベントが発火するようになります。
入力が完了したら、「次へ」を押下します。
{
"detail": {
"data.type": [
"s"
]
}
}
ターゲット選択にて、ターゲットタイプは「AWSのサービス」、ターゲットを選択は「Lambda関数」、関数は先ほど作成したLambda関数を選択します。
「次へ」を押下します。
特に変更せず「次へ」を押下します。
内容確認して、問題なければ「ルールの作成」を押下します。
ルールの作成が完了しました。
上記設定が完了すると、Lambdaの画面にて、以下のようにトリガーにEventBridgeが表示されるようになります。
これにて、設定が完了しました。
最後に動作確認を行っていきます。
動作確認
サンプルコードを使ってローカルにてアプリケーションを立ち上げ、ログインします。
手順としては省略させていただきます。
サンプルなどについては下記記事をご参照ください。
NewRelicのLogsを開くと以下のように、ログインをしたタイミングの日時のグラフとログが出力できていることが確認できました。
ログを押下すると、ログの詳細も確認できます。
以上で動作確認も完了となります。
細かいNew Relicの設定などは今回は省略いたします。
さいごに
以上、Auth0、EventBridge、Lambda、New Relicを利用して、認証・認可のログを分析できるようにしてみました。
実際に分析に使うには、New Relic側の設定が必要ですが、今回その辺りの設定は省略させていただきました。
認証・認可のログを分析できるようになることで、システム・ビジネスの観点両方において、大きなメリットが得られると思います。
また、Auth0やNew Relicを利用することで、複雑な実装の手間なく設定を行うことができます。
Auth0によるログの分析方法など検討中の方々のご参考になれば幸いです。
参考